import axios from 'axios'
import storejs from 'store'
import STORECONST from '../../storeConst'
import router from '../../../router'
import log from './log'
import store from '@/store'
import { AJAXLOADING } from '@/store/mutation-types'
import { Message } from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

const ajax = (options) => {
	let option = {
		// 请求的接口，在请求的时候，如axios.get(url,config);这里的url会覆盖掉config中的url
		url: '',
		// 请求方法同上
		method: 'post', // default
		// 基础url前缀
		baseURL: '',
		// 请求之前的数据
		// transformRequest: [function (data) {
		// 	// 这里可以在发送请求之前对请求数据做处理，比如form-data格式化等，这里可以使用开头引入的Qs（这个模块在安装axios的时候就已经安装了，不需要另外安装）
		// 	// data = Qs.stringify({});
		// 	return data
		// }],
		// // 请求之后的数据
		// transformResponse: [function (data) {
		// 	// 这里提前处理返回的数据
		// 	return data
		// }],
		// 请求头信息
		headers: {},
		// parameter参数
		params: {},
		// post参数，使用axios.post(url,{},config);如果没有额外的也必须要用一个空对象，否则会报错
		data: {},
		// 设置超时时间(毫秒)
		// timeout: 5000,
		timeout: 10 * 1000,
		// 返回数据类型
		responseType: 'json' // default
	}

	/* 显示加载中动画 */
	store.commit(AJAXLOADING, true)
	/**
	 * 调用网络请求
	 */
	// function funErr () {
	//   return false
	// }
	if (options !== null && options !== undefined && options instanceof Object) {
		// 如果有用户信息将用户信息放入 headers
		let userinfo = storejs.get(STORECONST.USERINFO)
		if (userinfo && userinfo.userId) {
			option.headers['ml.fast.session.id'] = userinfo.accessTicket
		}

		// 判断请求类型post情况需要JSON.stringify转码给后台
		if (!options.method || options.method.toLowerCase() === 'get') {
			options.params = options.data
		} else {
			// 如果是正常类型请求, 将进行转码处理, 通常FormData类型为文件上传类型
			if (!(options.data instanceof FormData)) {
				options.data = JSON.stringify(options.data)
			}
		}
		/**
		 * 合并用户参数
		 * Object.assign(target, source1, source2)
		 */
		Object.assign(option, options)
		// 执行请求
		axios(option).then(function (resultData) {
			/* 隐藏加载中动画 */
			store.commit(AJAXLOADING, false)
			// 判断是否通讯正常
			if (resultData.status === 200) {
				// resultData 为 axios 返回结果集,需要处理后才能返回
				let rsd = resultData.data
				// 平台接口返回
				if (rsd) {
					if (rsd.status !== undefined) {
						// 0:正常返回数据 10010:没有数据返回,数据为空 10003: 查询不到数据 [1502441286745-9525777]
						if (rsd.status === 0) {
							let rs = rsd
							log({ msg: '【接口返回】', option: option, rs: rs })
							if (option.success && typeof (option.success) === 'function') {
								return option.success(rs);
							}
						}
						 else if (rsd.status === 1001) {
							log({ msg: '【未登录】', option: option, rs: rsd });
							Message({
								message: rsd.msg,
								type: "warning",
								showClose: true,
								duration: 1500
							})
							// 未登录跳转到登录页面,并且传递返回页面地址
							router.push({ path: '/Login', query: { redirect: router.currentRoute.fullPath } });
						}
						 else if (rsd.status === 1002) {
							log({ msg: '【接口无权限】', option: option, rs: rsd })
							Message({
								message: rsd.msg,
								type: "warning",
								showClose: true,
								duration: 1500
							})
							return
						} else {
							log({ msg: '【接口异常】', option: option, rs: rsd })
							Message({
								message: rsd.msg,
								type: "error",
								showClose: true,
								duration: 5 * 1000
							})
							if (option.fail && typeof (option.fail) === 'function') {
							  return option.fail(rsd)
							}
						}
					} else {
						log({ msg: '【resultData结果异常】', option: option, rs: rsd })
					}
				} else {
					// 如果是上传文件,包装返回值,其他场景暂时忽略
					if ((option.data instanceof FormData)) {
						let simdata = { 'status': 0, 'msg': 'FormData格式数据请求成功' }
						if (option.success && typeof (option.success) === 'function') {
							return option.success(simdata)
						}
					}
					log({ msg: '接口通讯正常,但未获取到异步请求 data 数据', option: option })
				}
			} else {
				// 返回状态非200情况
				log({ msg: '接口通讯异常', option: option, rs: resultData })
			}
		}).catch(function (error) {
			/* 隐藏加载中动画 */
			store.commit(AJAXLOADING, false)
			Message({
				message: `[系统错误]${error.message}`,
				type: "error",
				showClose: true,
				duration: 1500
			})
			if (error.code === 'ECONNABORTED') {
				log({ msg: '请求超时' })
			} else {
				log({ msg: error.message, leave: 'ERROR' })
			}
		})
	} else {
		/* 隐藏加载中动画 */
		store.commit(AJAXLOADING, false)
		log({ msg: '数据异常, ajax参数为空' })
		Message({
			message: `[数据异常]ajax参数为空`,
			type: "error",
			showClose: true,
			duration: 1500
		})
	}
}

export default ajax
